js中 for-in 循环和 for-of 循环的区别

来源:博客站 01月24日 18:45

在 JavaScript 中,for-in 循环和 for-of 循环是用于遍历集合的两种不同方式,但它们有不同的用途和行为。以下是它们的主要区别:

for-in 循环

  1. 遍历对象属性

    • for-in 循环用于遍历对象的可枚举属性(包括原型链上的属性,除非使用 hasOwnProperty 方法进行过滤)。
    • 它不仅适用于数组,还适用于对象、Map 和 Set(但通常不用于遍历 Map 和 Set,因为 for-of 更适合)。
  2. 属性顺序

    • 遍历属性的顺序不保证是插入顺序,特别是在 ES2015 及更高版本中,属性的遍历顺序可能会受到一些因素的影响(如数字键的排序)。
  3. 语法

    const obj = { a: 1, b: 2, c: 3 };
    for (const key in obj) {
      if (obj.hasOwnProperty(key)) {
        console.log(key, obj[key]);
      }
    }
    
  4. 枚举性

    • for-in 循环只遍历对象的可枚举属性,不可枚举属性(如通过 Object.defineProperty 定义的属性,且 enumerable 设置为 false)不会被遍历。

for-of 循环

  1. 遍历可迭代对象

    • for-of 循环用于遍历可迭代对象(如数组、字符串、Map、Set、TypedArray、NodeList 等)。
    • 它直接遍历对象的值,而不是键。
  2. 顺序

    • 遍历顺序是插入顺序,对于数组和字符串,它按索引顺序遍历。
  3. 语法

    const arr = [1, 2, 3];
    for (const value of arr) {
      console.log(value);
    }
    
    const str = 'hello';
    for (const char of str) {
      console.log(char);
    }
    
    const map = new Map([['a', 1], ['b', 2]]);
    for (const [key, value] of map) {
      console.log(key, value);
    }
    
  4. 不遍历对象属性

    • for-of 循环不能用于普通对象,因为普通对象不是可迭代对象。如果尝试对普通对象使用 for-of,会抛出错误。

总结

  • 使用 for-in 循环遍历对象的可枚举属性(包括原型链上的属性,需要 hasOwnProperty 过滤)。
  • 使用 for-of 循环遍历可迭代对象的值(如数组、字符串、Map、Set 等)。

选择哪种循环取决于你要遍历的数据类型以及你的具体需求。

原文出处: 内容源于AI仅供参考,请勿使用于商业用途。如若转载请注明原文及出处。
出处地址:http://www.07sucai.com/tech/318.html
版权声明:本文来源地址若非本站均为转载,若侵害到您的权利,请及时联系我们,我们会在第一时间进行处理。

今日推荐

js严格模式的限制详解
从小白到上线:小程序开发全流程实战指南
几个月没效果,为什么还坚持做SEO优化?
tsx转换成真实DOM过程
label标签的作用是什么?
webpack与grunt、gulp的不同?
foreach 和 map 可以跳出循环吗?
UniApp 如何处理支付功能?